package com.kexio.enterprise.governance.retry;

import com.kexio.enterprise.governance.retry.config.RetryConfig;
import com.kexio.enterprise.governance.retry.result.RetryResult;
import com.kexio.enterprise.governance.retry.statistics.RetryStatistics;

import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

/**
 * 重试服务接口（重构版本）
 * 
 * 采用独立文件方式组织相关类，提高代码的可维护性和可扩展性
 * 
 * @author Kexio
 * @since 1.0.0
 */
public interface RefactoredRetryService {

    /**
     * 执行带重试的操作
     * 
     * @param key      重试键
     * @param supplier 操作提供者
     * @param <T>      返回类型
     * @return 执行结果
     */
    <T> RetryResult<T> execute(String key, java.util.function.Supplier<T> supplier);

    /**
     * 执行带重试的操作（自定义配置）
     * 
     * @param key      重试键
     * @param supplier 操作提供者
     * @param config   重试配置
     * @param <T>      返回类型
     * @return 执行结果
     */
    <T> RetryResult<T> execute(String key, java.util.function.Supplier<T> supplier, RetryConfig config);

    /**
     * 执行带重试的操作（带降级）
     * 
     * @param key      重试键
     * @param supplier 操作提供者
     * @param fallback 降级操作
     * @param <T>      返回类型
     * @return 执行结果
     */
    <T> RetryResult<T> execute(String key, java.util.function.Supplier<T> supplier, java.util.function.Supplier<T> fallback);

    /**
     * 异步执行带重试的操作
     * 
     * @param key      重试键
     * @param supplier 操作提供者
     * @param <T>      返回类型
     * @return 异步执行结果
     */
    <T> CompletableFuture<RetryResult<T>> executeAsync(String key, java.util.function.Supplier<T> supplier);

    /**
     * 异步执行带重试的操作（自定义配置）
     * 
     * @param key      重试键
     * @param supplier 操作提供者
     * @param config   重试配置
     * @param <T>      返回类型
     * @return 异步执行结果
     */
    <T> CompletableFuture<RetryResult<T>> executeAsync(String key, java.util.function.Supplier<T> supplier, RetryConfig config);

    /**
     * 执行Runnable操作
     * 
     * @param key      重试键
     * @param runnable 操作
     * @return 执行结果
     */
    RetryResult<Void> execute(String key, Runnable runnable);

    /**
     * 执行Runnable操作（自定义配置）
     * 
     * @param key      重试键
     * @param runnable 操作
     * @param config   重试配置
     * @return 执行结果
     */
    RetryResult<Void> execute(String key, Runnable runnable, RetryConfig config);

    /**
     * 设置重试配置
     * 
     * @param key    重试键
     * @param config 重试配置
     */
    void setConfig(String key, RetryConfig config);

    /**
     * 获取重试配置
     * 
     * @param key 重试键
     * @return 重试配置
     */
    RetryConfig getConfig(String key);

    /**
     * 删除重试配置
     * 
     * @param key 重试键
     */
    void remove(String key);

    /**
     * 获取所有重试键
     * 
     * @return 重试键集合
     */
    java.util.Set<String> getAllKeys();

    /**
     * 获取重试统计信息
     * 
     * @param key 重试键
     * @return 统计信息
     */
    RetryStatistics getStatistics(String key);

    /**
     * 获取所有重试统计信息
     * 
     * @return 统计信息映射
     */
    Map<String, RetryStatistics> getAllStatistics();

    /**
     * 清空统计信息
     * 
     * @param key 重试键
     */
    void clearStatistics(String key);

    /**
     * 检查重试配置是否存在
     * 
     * @param key 重试键
     * @return 是否存在
     */
    boolean exists(String key);
}
